procedure circl ;
var
  change , flag , x2 , y2 : integer ;
  x1 , y1 , rad , colour : integer ;
  c : char ;

procedure draw_circle(x,y,rad,colour:integer) ;
 var
   x1 , y1 , x2 , y2 , n : integer ;
   horiz , vert , diag : real ;
 begin
   plot(x,y,3) ;
   plot(x,y-rad,colour) ;
   plot(x,y+rad,colour) ;
   x1 := x ;
   y1 := y - rad ;
   while ( y1 <= y ) do
    begin
      x2 := x1 + 1 ;
      y2 := y1 ;
      horiz := abs(((x2-x)*(x2-x)) + ((y2-y)*(y2-y)) - (rad*rad)) ;
      x2 := x1 + 1 ;
      y2 := y1 + 1 ;
      diag := abs(((x2-x)*(x2-x)) + ((y2-y)*(y2-y)) - (rad*rad)) ;
      x2 := x1 ;
      y2 := y1 + 1 ;
      vert := abs(((x2-x)*(x2-x)) + ((y2-y)*(y2-y)) - (rad*rad)) ;
      if ( horiz < diag ) then
         if ( horiz < vert ) then
            x1 := x1 + 1
         else
            y1 := y1 + 1
      else
         if ( diag < vert ) then
          begin
            x1 := x1 + 1 ;
            y1 := y1 + 1 ;
          end
         else
            y1 := y1 + 1 ;
     plot(x1,y1,colour) ;
     plot(2*x-x1,y1,colour) ;
     plot(x1,2*y-y1,colour) ;
     plot(2*x-x1,2*y-y1,colour) ;
    end ;
 end ;

begin
  change := 0 ;
  x1 := 160 ;
  y1 := 100 ;
  rad := 0 ;
  x2 := x1 ;
  y2 := y1 ;
  colour := 3 ;
  draw_circle(x1,y1,rad,3) ;
  c := '0' ;
  while ( ord(c) <> 27 ) do
   begin
    plot(x2,y2,3) ;
    printcoor(x2,y2) ;
    read(kbd,c) ;
    c := upcase(c) ;
    if ( c = 'S' ) then
       flag := 1 ;
    if ( c = 'M' ) then
       flag := 3 ;
    if ( c = 'N' ) then
     begin
       flag := 0 ;
       draw_circle(x1,y1,rad,3) ;
     end ;
    case c of
      '8' : begin
              if ( y2 > 11 ) then
               begin
                 if ( change = 0 ) then
                  begin
                    plot(x2,y2,colour) ;
                    colour := getdotcolor(x2,y2-1) ;
                  end ;
                 change := 0 ;
                 y2 := y2 - 1 ;
                 if ( flag = 3 ) then
                  begin
                    plot(x1,y1+1,0) ;
                    draw_circle(x1,y1,rad,0) ;
                    y1 := y2 ;
                    x1 := x2 ;
                    plot(x1,y1,3) ;
                    draw_circle(x1,y1,rad,3) ;
                  end ;
                 if ( flag = 1 ) then
                  begin
                    if ( y2 > y1 ) then
                     begin
                       draw_circle(x1,y1,rad,0) ;
                       rad := rad - 1 ;
                       draw_circle(x1,y1,rad,3) ;
                     end ;
                    if ( y1 > y2 ) then
                     begin
                       draw_circle(x1,y1,rad,0) ;
                       rad := rad + 1 ;
                       draw_circle(x1,y1,rad,3) ;
                     end ;
                  end ;
               end ;
            end ;
      '2' : begin
              if ( y2 < 199 ) then
               begin
                 if ( change = 0 ) then
                  begin
                    plot(x2,y2,colour) ;
                    colour := getdotcolor(x2,y2+1) ;
                  end ;
                 change := 0 ;
                 y2 := y2 + 1 ;
                 if ( flag = 3 ) then
                  begin
                    plot(x1,y1-1,0) ;
                    draw_circle(x1,y1,rad,0) ;
                    y1 := y2 ;
                    x1 := x2 ;
                    plot(x1,y1,3) ;
                    draw_circle(x1,y1,rad,3) ;
                  end ;
                 if ( flag = 1 ) then
                  begin
                    if ( y2 > y1 ) then
                     begin
                       draw_circle(x1,y1,rad,0) ;
                       rad := rad + 1 ;
                       draw_circle(x1,y1,rad,3) ;
                     end ;
                    if ( y1 > y2 ) then
                     begin
                       draw_circle(x1,y1,rad,0) ;
                       rad := rad - 1 ;
                       draw_circle(x1,y1,rad,3) ;
                     end ;
                  end ;
               end ;
            end ;
      '4' : begin
              if ( x2 > 0 ) then
               begin
                 if ( change = 0 ) then
                  begin
                    plot(x2,y2,colour) ;
                    colour := getdotcolor(x2-1,y2) ;
                  end ;
                 change := 0 ;
                 x2 := x2 - 1 ;
                 if ( flag = 3 ) then
                  begin
                    plot(x1+1,y1,0) ;
                    draw_circle(x1,y1,rad,0) ;
                    y1 := y2 ;
                    x1 := x2 ;
                    plot(x1,y1,3) ;
                    draw_circle(x1,y1,rad,3) ;
                  end ;
                 if ( flag = 1 ) then
                  begin
                    if ( x2 > x1 ) then
                     begin
                       draw_circle(x1,y1,rad,0) ;
                       rad := rad - 1 ;
                       draw_circle(x1,y1,rad,3) ;
                     end ;
                    if ( x1 > x2 ) then
                     begin
                       draw_circle(x1,y1,rad,0) ;
                       rad := rad + 1 ;
                       draw_circle(x1,y1,rad,3) ;
                     end ;
                  end ;
               end ;
            end ;
      '6' : begin
              if ( x2 < 319 ) then
               begin
                 if ( change = 0 ) then
                  begin
                    plot(x2,y2,colour) ;
                    colour := getdotcolor(x2+1,y2) ;
                  end ;
                 change := 0 ;
                 x2 := x2 + 1 ;
                 if ( flag = 3 ) then
                  begin
                    plot(x1-1,y1,0) ;
                    draw_circle(x1,y1,rad,0) ;
                    y1 := y2 ;
                    x1 := x2 ;
                    plot(x1,y1,3) ;
                    draw_circle(x1,y1,rad,3) ;
                  end ;
                 if ( flag = 1 ) then
                  begin
                    if ( x2 > x1 ) then
                     begin
                       draw_circle(x1,y1,rad,0) ;
                       rad := rad + 1 ;
                       draw_circle(x1,y1,rad,3) ;
                     end ;
                    if ( x1 > x2 ) then
                     begin
                       draw_circle(x1,y1,rad,0) ;
                       rad := rad - 1 ;
                       draw_circle(x1,y1,rad,3) ;
                     end ;
                  end ;
               end ;
            end ;
      '7' : begin
              if ( x2 > 0 ) and ( y2 > 11 ) then
               begin
                 if ( change = 0 ) then
                  begin
                    plot(x2,y2,colour) ;
                    colour := getdotcolor(x2-1,y2-1) ;
                  end ;
                 change := 0 ;
                 x2 := x2 - 1 ;
                 y2 := y2 - 1 ;
                 if ( flag = 3 ) then
                  begin
                    plot(x1+1,y1+1,0) ;
                    draw_circle(x1,y1,rad,0) ;
                    y1 := y2 ;
                    x1 := x2 ;
                    plot(x1,y1,3) ;
                    draw_circle(x1,y1,rad,3) ;
                  end ;
               end ;
            end ;
      '9' : begin
              if ( x2 < 319 ) and ( y2 > 11 ) then
               begin
                 if ( change = 0 ) then
                  begin
                    plot(x2,y2,colour) ;
                    colour := getdotcolor(x2+1,y2-1) ;
                  end ;
                 change := 0 ;
                 x2 := x2 + 1 ;
                 y2 := y2 - 1 ;
                 if ( flag = 3 ) then
                  begin
                    plot(x1-1,y1+1,0) ;
                    draw_circle(x1,y1,rad,0) ;
                    y1 := y2 ;
                    x1 := x2 ;
                    plot(x1,y1,3) ;
                    draw_circle(x1,y1,rad,3) ;
                  end ;
               end ;
            end ;
      '1' : begin
              if ( x2 > 0 ) and ( y2 < 199 ) then
               begin
                 if ( change = 0 ) then
                  begin
                    plot(x2,y2,colour) ;
                    colour := getdotcolor(x2-1,y2+1) ;
                  end ;
                 change := 0 ;
                 x2 := x2 - 1 ;
                 y2 := y2 + 1 ;
                 if ( flag = 3 ) then
                  begin
                    plot(x1+1,y1-1,0) ;
                    draw_circle(x1,y1,rad,0) ;
                    y1 := y2 ;
                    x1 := x2 ;
                    plot(x1,y1,3) ;
                    draw_circle(x1,y1,rad,3) ;
                  end ;
               end ;
            end ;
      '3' : begin
              if ( x2 < 319 ) and ( y2 < 199 ) then
               begin
                 if ( change = 0 ) then
                  begin
                    plot(x2,y2,colour) ;
                    colour := getdotcolor(x2+1,y2+1) ;
                  end ;
                 change := 0 ;
                 x2 := x2 + 1 ;
                 y2 := y2 + 1 ;
                 if ( flag = 3 ) then
                  begin
                    plot(x1-1,y1-1,0) ;
                    draw_circle(x1,y1,rad,0) ;
                    y1 := y2 ;
                    x1 := x2 ;
                    plot(x1,y1,3) ;
                    draw_circle(x1,y1,rad,3) ;
                  end ;
               end ;
            end ;

     end ;
   if ( ord(c) = 13 ) then
    begin
      draw_circle(x1,y1,rad,3) ;
      x1 := x2 ;
      y1 := y2 ;
      plot(x1,y1,3) ;
      rad := 1 ;
      change := 1 ;
    end ;
  end ;
end ;
